package com.stark.commons.spring.web.util;

import org.apache.commons.lang3.StringUtils;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 与 Spring Web 相关的公共方法集合。
 * @author Ben
 * @since 1.0.0
 * @version 1.0.0
 */
public class Utils extends com.stark.commons.spring.core.util.Utils {
	
	/**
	 * 将校验错误封装成 {@link HashMap} 。
	 * @param result 校验结果。
	 * @return 错误 {@link HashMap} ，key 为校验字段，value 为错误描述。
	 */
	public static Map<String, String> getErrorMap(BindingResult result) {
		return result.getFieldErrors()
				.stream()
				.collect(Collectors.toMap(FieldError::getField, DefaultMessageSourceResolvable::getDefaultMessage));
	}
	
	/**
	 * 组织校验错误字符串。
	 * @param result 校验结果。
	 * @return 错误字符串。
	 */
	public static String getErrorString(BindingResult result) {
		StringBuffer sb = new StringBuffer("<table>");
		result.getFieldErrors()
			.forEach(error -> sb.append("<tr><td>").append(error.getDefaultMessage()).append("</td></tr>"));
		sb.append("</table>");
		return sb.toString();
	}
	
	/**
	 * 获取网关地址。
	 * @param request HTTP 请求对象。
	 * @return 网关地址。
	 */
	public static String getGateway(HttpServletRequest request) {
		String xForwardedProto = request.getHeader("x-forwarded-proto");
		String xForwardedHost = request.getHeader("x-forwarded-host");
		String xForwardedPrefix = request.getHeader("x-forwarded-prefix");
		if (StringUtils.isNotBlank(xForwardedProto)
				&& StringUtils.isNotBlank(xForwardedHost)) {
			if (!"http".equalsIgnoreCase(xForwardedProto) && !"https".equalsIgnoreCase(xForwardedProto)) {
				xForwardedProto = "http";
			}
			if (xForwardedHost.contains(",")) {
				xForwardedHost = StringUtils.substringBefore(xForwardedHost, ",")
						.replace(" ", "");
			}
			return xForwardedProto + "://" + xForwardedHost + StringUtils.defaultString(xForwardedPrefix);
		}
		
		String requestURL = request.getRequestURL().toString();
		String requestURI = request.getRequestURI();
		return StringUtils.substringBefore(requestURL, requestURI);
	}
	
}
